package com.itheima.reflect.context;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

public class ClasspathApplicationContext implements ApplicationContext {

    // 定义一个容器存储系统中可能使用到的对象
    private ConcurrentHashMap<String, Object> beans = new ConcurrentHashMap<>();

    // 定义构造方法
    public ClasspathApplicationContext(String fileName) {

        // 补全代码
        try {

            // 获取配置文件所对应输入流对象
            InputStream inputStream = ClasspathApplicationContext.class.getClassLoader().getResourceAsStream(fileName);

            // 获取解析器对象
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read(inputStream);

            // 获取跟节点对象
            Element element = document.getRootElement();

            // 通过根据节点对象获取所有的bean子节点对象
            List<Element> elements = element.elements("bean");

            // 遍历集合
            for(Element e : elements) {

                // 获取name属性的值，和class属性的值
                String name = e.attributeValue("name");
                String className = e.attributeValue("class");

                // 通过反射创建对象存储到beans集合中
                Class clazz = Class.forName(className);
                beans.put(name , clazz.newInstance()) ;

            }

        }catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public <T> T getBean(Class<T> clazz) {

        // 遍历beans集合
        Collection<Object> values = beans.values();
        for(Object obj : values) {
            if(clazz == obj.getClass()) {       // 判断Class类型是否相当，如果是直接返回该对象即可
                return (T)obj ;
            }
        }

        return null;
    }

}
